package com.geek.bams.dao;

import java.util.Calendar;

/**
 *               {ArrayDao
 * Bank——>IDao——>{FileDao
 *               {ListDao
 *               {JDBCDao
 */
//泛型  任意的大写字母
//T 代表容器中元素的类型，例如：Account
//K 代表容器的类型，例如：Account[] 、 List<Account>
public interface IDao<T , K> {
    /**
     * 之前基于数组的写法
     * public boolean insert(Account acc);
     * public Account selectOne(Long id , String password);
     * public Account selectOne(Long id);
     * public Account[] selectAll();
     */
    //下面使用泛型
    //插入元素
    public boolean insert(T t);
    //根据ID和密码查询
    public T selectOne(Long id , String password);
    //根据ID查询
    public T selectOne(Long id);
    //查询所有银行账户
    public K selectAll();

    //获取ID
    public Long getId();
    //设置ID
    public void setId(Long id);

    //获取ID方法 createId()  ArrayDao、ListDao、FileDao 实现逻辑一样
    //default默认方法，有利于接口改造升级
    //生成账户ID
    public default Long createID(){
        //86215021 2013 02 0001(国家+邮编+年+月+序号)
        //1.获取初始ID值
        String idStr = getId().toString();
        //2.ID值 86215021 2013 02 0001
        Integer year = Integer.valueOf(idStr.substring(8, 12));
        Integer month = Integer.valueOf(idStr.substring(12, 14));
        String count = idStr.substring(14);
        //3.获取当前年月
        Calendar c = Calendar.getInstance();
        int nowYear = c.get(Calendar.YEAR);
        int nowMonth = c.get(Calendar.MONTH)+1;
        if(year!=nowYear || month!=nowMonth){
            year = nowYear;
            month = nowMonth;
            count = "0001";
        }

        //4.判断是否达到9999 提示次月再来
        if(count.equals("9999")){
            count = "0001";
            System.out.println("本月已满，下月再来");
            //传个负值，用于辨别，说明事情没有办成
            //如果传个0回去，因为默认返回也是0，因此不好辨别做的事的结果
            return -1L;
        }

        //四.组装 862150212025100001
        String str = "";
        if(month<10){
            str = "86215021"+year+"0"+month+count;
        }else{
            str = "86215021"+year+month+count;
        }

        //5.累加计数并返回
        Long id = Long.valueOf(str);
        setId(id+1);
        return id;
    }

    /**
     * 基于内存操作，暂时不需要更新方法
     * 基于文件（FileDao）、JDBC数据库（JDBCDao）等涉及到磁盘操作需要更新方法
     */
    //新增 更新账户方法（基于内存操作 ArrayDao、ListDao不需要 ； 基于文件操作FileDao 、 基于数据库操作JDBCDao 需要）
    //默认方法  有利于接口拓展
    public default boolean update(T t) {
        return false;
    }

}
